昨日介紹了事務的4個特性,其中的隔離性(Isolation),在處理高併發系統時是非常重要的。它確保了多個事務在同時運行時能夠互不干擾,從而避免發生資料不一致的狀況。
它能夠防止發生以下資料讀取問題:
髒讀(Dirty Read),意旨一個事務正在存取資料,並對資料進行了修改,而在修改還沒有被提交(Commit)到資料庫的同時,另一個事務讀取了尚未提交的資料,假設事務最後回滾了,那麼讀到的資料會是錯誤的。
假設事務A正在存取資料但尚未提交,事務B讀到了事務A尚未提交的資料,如果事務A操作失敗RollBack後,事務B讀到的資料就會是有問題的。
不可重複讀取(Non-repeatable Read),表示一個事務在重複讀取兩次相同的資料時,會得到不一樣的結果。
假設事務A正在讀取一筆資料,恰巧事務B也在讀取資料並且修改了資料內容也完成了提交,事務A再次讀取時發現資料與第一次讀取的結果不一致。
幻讀(Phantom Read),代表事務在查詢時,另一個事務新增或刪除了一筆資料,導致事務第二次查詢時多了一筆資料或是少了一筆資料。
假設事務A透過指定條件查詢得到了10筆資料,事務B新增了一筆符合事務A查詢條件的資料,當事務A發起第二次查詢時得到了11筆資料。
在標準SQL規範中定義了事務隔離的4個層級,根據效能最好但一致性最差到效能最差但一致性最好的排序如下:
隔離層級 | 發生髒讀 | 可重複讀取 | 發生幻讀 |
---|---|---|---|
Read Uncommitted | 是 | 是 | 是 |
Read Committed | 否 | 是 | 是 |
Repeatable Read | 否 | 否 | 是 |
Serializable | 否 | 否 | 否 |